package cn.assumejson.springframework.core.util;

import net.sf.cglib.transform.MethodFilter;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * @author gang.Li
 * @version 1.0
 * @since 1.0 2021/12/9 17:36
 */
public class ReflectionUtils {

    /**
     * 筛选 所有代理类，除了使用{@link org.aspectj.lang.annotation.Pointcut}
     * {@link org.aspectj.lang.annotation.Around} 环绕通知
     * {@link org.aspectj.lang.annotation.Before} 前置通知
     * {@link org.aspectj.lang.annotation.After} 后置通知
     * {@link org.aspectj.lang.annotation.AfterThrowing} 异常通知
     *
     * @param clazz 切面类
     * @param mc    函数式接口
     * @param mf    方法过滤器
     */
    public static void doWithMethods(Class<?> clazz, MethodCallback mc) {
        // 获取所有的方法
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            Pointcut annotation = declaredMethod.getAnnotation(Pointcut.class);
            if (annotation == null) {
                try {
                    mc.doWith(declaredMethod);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public static void makeAccessible(Method method) {
        if ((!Modifier.isPublic(method.getModifiers()) ||
                !Modifier.isPublic(method.getDeclaringClass().getModifiers())) && !method.isAccessible()) {
            method.setAccessible(true);
        }
    }
}
